Completed
Push — master ( b61f0a...ad8f99 )
by Andres
25:26
created

lineReader.line   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
nc 1
dl 0
loc 8
rs 9.4285
nop 1
1
/* eslint-env node */
2
/*jslint node: true */
3
'use strict';
4
5
let jsonfile = require('jsonfile');
6
let parser = require('molecular-parser');
7
8
let args = process.argv.slice(2);
9
10
let resources = jsonfile.readFileSync(args[0]+'/data/resources.json');
11
let elements = jsonfile.readFileSync(args[0]+'/data/elements.json');
12
13
for (let element in elements) {
14
  elements[element].reactions = elements[element].reactions || [];
15
}
16
17
let lineReader = require('readline').createInterface({
18
  input: require('fs').createReadStream(args[0]+'/data/raw_reactions.txt')
19
});
20
21
let reactions = {};
22
// for each reaction
23
lineReader.on('line', function (line) {
24
  let reaction = parseReaction(line);
25
  let key = generateKey(reaction);
26
  reactions[key] = {};
27
  reactions[key].reactant = vectorToMap(reaction[0]);
28
  reactions[key].product = vectorToMap(reaction[1]);
29
  extractElements(reactions[key], key);
30
});
31
32
lineReader.on('close', function () {
33
  jsonfile.writeFileSync(args[0]+'/data/resources.json', resources, {
34
    spaces: 2
35
  });
36
  jsonfile.writeFileSync(args[0]+'/data/elements.json', elements, {
37
    spaces: 2
38
  });
39
  jsonfile.writeFileSync(args[0]+'/data/reactions.json', reactions, {
40
    spaces: 2
41
  });
42
});
43
44
function vectorToMap(vector){
45
  let map = {};
46
  for(let i in vector){
47
    let resource = vector[i];
48
    if(elements[resource] !== undefined){
49
      resource = elements[resource].main;
50
    }
51
    map[resource] = map[resource]+1 || 1;
52
  }
53
  return map;
54
}
55
56
function extractElements(reaction, key) {
57
  reaction.elements = [];
58
  elementsFromHalf(reaction.reactant, reaction.elements, key);
59
  elementsFromHalf(reaction.product, reaction.elements, key);
60
}
61
62
function elementsFromHalf(half, reactElements, key){
63
  for (let molecule in half) {
64
    let breakdown = parser.decomposeFormula(molecule);
65
  	if (!resources[molecule] && !elements[molecule]) {
66
        resources[molecule] = {};
67
        resources[molecule].elements = breakdown;
68
        resources[molecule].html = generateHTML(breakdown);
69
        resources[molecule].type = ['molecule'];
70
      }
71
    for (let j in breakdown) {
72
      // we add the elements involved in both parts
73
      if (reactElements.indexOf(j) === -1) {
74
        reactElements.push(j);
75
      }
76
      if (elements[j].includes.indexOf(molecule) === -1) {
77
        elements[j].includes.push(molecule);
78
      }
79
      if (elements[j].reactions.indexOf(key) === -1) {
80
        elements[j].reactions.push(key);
81
      }
82
    }
83
  }
84
}
85
86
function generateKey(reaction) {
87
  let key = '';
88
  for (let half in reaction) {
89
    for (let i in reaction[half]) {
90
      key += reaction[half][i] + '.';
91
    }
92
    key = key.replace(/.$/, '');
93
    key += '-';
94
  }
95
  key = key.replace(/-$/, '');
96
  return key;
97
}
98
99
function parseReaction(line) {
100
  let part = line.split('->');
101
  let reaction = [];
102
  for (let i in part) {
103
    reaction[i] = part[i].trim().split(' ').sort();
104
  }
105
  return reaction;
106
}
107
108
function generateHTML(breakdown){
109
  let html = '';
110
  for (let k in breakdown) {
111
    html += k;
112
    let number = breakdown[k];
113
    if(number > 1){
114
      html += '<sub>'+number+'</sub>';
115
    }
116
  }
117
  return html;
118
}
119